home *** CD-ROM | disk | FTP | other *** search
- /*
- * DependentsMixin abstract class
- *
- * a mixin that keeps a list of dependent objects and implements
- * a change propogation semantics. Useful for "Active value"
- * or "deamon" based programming.
- *
- * Copyright © John Wainwright 1989
- *
- * SuperClasses :
- *
- * Instance Vars :
- *
- * dependents - the dependent list
- *
- * Class Vars :
- *
- * Methods :
- *
- * addDependents o - add object to dependent list
- * dltDependent o - delete object from dependent list
- * dependentsOf - return dependent list
- * changed - this object has changed, propogate news
- * to all dependents
- * changing - this object is about to change; prepare way.
- * dispose - disposes the dependent list
- *
- * Class Methods :
- *
- */
-
- #include "oic.h"
- #include "generics.h"
-
- class DependentsMixin; /* the DependentsMixin class */
-
- struct DependentsMixin_i /* DependentsMixin instance structure */
- {
- object dependents; /* dependent List */
- };
- typedef struct DependentsMixin_i DependentsMixin_i;
-
- /* -------------------- DependentsMixin Instance methods ------------------- */
-
- method object
- _addDependent(self, d, op)
- object self;
- register DependentsMixin_i *d;
- register object *op;
- {
- if (d->dependents == NULL)
- d->dependents = New(List, *op, END);
- else
- d->dependents = push(d->dependents, *op);
- return *op;
- }
-
- method object
- _dltDependent(self, d, op)
- object self;
- register DependentsMixin_i *d;
- register object *op;
- {
- if (d->dependents == NULL)
- d->dependents = New(List, END);
- else
- d->dependents = delete(d->dependents, *op);
- return *op;
- }
-
- method object
- _dependentsOf(self, d)
- object self;
- register DependentsMixin_i *d;
- {
- if (d->dependents == NULL)
- d->dependents = New(List, END);
-
- return d->dependents;
- }
-
- method object
- _changed(self, d)
- object self;
- register DependentsMixin_i *d;
- {
- register object seq, dependent;
-
- if (d->dependents == NULL)
- d->dependents = New(List, END);
-
- for (seq = sequence(d->dependents); dependent = next(seq); )
- hasChanged(dependent, self);
-
- return self;
- }
-
- method object
- _changing(self, d)
- object self;
- register DependentsMixin_i *d;
- {
- register object seq, dependent;
-
- if (d->dependents == NULL)
- d->dependents = New(List, END);
-
- for (seq = sequence(d->dependents); dependent = next(seq); )
- isChanging(dependent, self);
-
- return self;
- }
-
- method void
- _dispose(self, d)
- object self;
- register DependentsMixin_i *d;
- {
- dispose(d->dependents);
- }
-
- /* ------------------- Init the DependentsMixin class ---------------------- */
-
- InitDependentsMixin()
- {
- DependentsMixin = NewClass(sizeof(DependentsMixin_i), 0, "DependentsMixin", END);
- AddMethods(DependentsMixin,
- addDependentGeneric, _addDependent,
- dltDependentGeneric, _dltDependent,
- dependentsOfGeneric, _dependentsOf,
- changedGeneric, _changed,
- changingGeneric, _changing,
- disposeGeneric, _dispose,
- END);
- }
-
-